// function fn (val:string | number) { // val:string | number 联合类型
// //   return (val as string).length;  // “number”上不存在属性“length”
//   return (<string>val).length;
// }
// console.log(fn('abcdefg'));


// interface Icat {
//     name: string
//     run(): void // void 空值 run() 代表函数
// }

// interface Ifish {
//     name: string
//     swim():void
// }

// let animal:Icat|Ifish = {
//   name: '我是一条鱼',
//   swim: () => {
//     console.log('我会游泳');
//   }
// }

// // typeof 判断类型的
// if(typeof (animal as Ifish).swim=='function'){
//     console.log('animal是一条鱼')
// }else{
//     console.log('animal是一只猫')
// }


// 接口
// interface Iobj {
//   name: string
// }

// function add (obj:Iobj){
//   return obj.name
// }
// console.log(add({name:'张三'}));



// interface Icat {
//     name: string
//     run(): void
// }

// interface Ifish {
//     name: string
//     swim():void
// }

// let animal:Icat|Ifish = {
//     name: '加菲猫',
//     run(){
//         console.log('加菲猫会跑')
//     }
// }

// console.log(animal.name);

// function isAnimal(animal:Icat|Ifish){
//     if(typeof (animal as Ifish).swim=='function'){
//         // console.log('animal是一条鱼')
//         (animal as Ifish).swim()
//     }else{
//         console.log('animal是一只猫')
//     }
// }

// isAnimal(animal)




// 约束函数
// 在ts中错误的写法
// function addNum(x,y){
//     return x + y
// }

// 当函数有返回值的时不候，我们可以给函数一个返回值的类型约束；
// function addNum(x:number,y:number):number{
//     return x + y
// }
// console.log(addNum(12,3));


// let addNum = function(x:number,y:number):number{
//     return x + y
// }

// addNum:(x:number,y:number)=>number 在ts里面 这个不是箭头函数的意思 => 就是对函数的定义 左边表示函数输入类型 右边表示函数输出的类型
// let addNum:(x:number,y:number)=>number = function(x:number,y:number):number{
//     return x + y
// }
// console.log(addNum(30,40));


// 接口对函数表达式的描述
//定义接口
interface Ifun {
  (x:number,y:number):number
}
// 接口约束函数
var addNum:Ifun = function(x:number,y:number):number{
    return x + y
}


